home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1995 January / Simtel - 10000 MSDOS Shareware Programs (Walnut Creek)(January 1995)(Disc 2).ISO / disc2 / turbo_c / joy.c < prev    next >
Internet Message Format  |  1988-03-26  |  4KB

  1. From: ajmyrvold@violet.waterloo.edu (Alan Myrvold)
  2. Newsgroups: comp.sys.ibm.pc
  3. Subject: Joystick routines
  4. Date: 24 Mar 88 07:35:25 GMT
  5. Keywords: Game Port, Joy Stick
  6.  
  7. How to read the joystick on an IBM PC.
  8.  
  9. This program, written for Turbo C, version 1.0 shows how
  10. the joystick postion may be read.
  11.  
  12. I am indebted to uunet!netxcom!jallen (John Allen) for answering
  13. my previous posting on the subject and providing technical 
  14. assistance. Text from his EMAIL to me is included in the program.
  15.  
  16. -------------------------------------------------------------------
  17. Alan Myrvold     ajmyrvold@violet.waterloo.edu
  18. -------------------------------------------------------------------
  19.  
  20. ----------------------------- JOY.C    ----------------------------
  21.  
  22. /* Demonstration of reading joy stick postition
  23.     Written March 24, 1988
  24.     Written by : ajmyrvold@violet.waterloo.edu (Alan J. Myrvold)
  25.     Technical assistance from : uunet!netxcom!jallen (John Allen)
  26.     Turbo C Version 1.0
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <dos.h>
  31. #include <bios.h>
  32.  
  33. typedef struct {
  34.     int sw1,sw2;
  35.     int x,y;
  36.     int cenx,ceny;
  37.     } joy_stick;
  38.  
  39. joy_stick joy;
  40.  
  41. #define keypressed (bioskey(1) != 0)
  42. #define kb_clear() while keypressed bioskey(0);
  43.  
  44. void GotoXY(int x,int y)
  45. {
  46.     union REGS r;
  47. /* Set XY position */
  48.     r.h.ah = 2;
  49.     r.h.bh = 0;            /* Assume Video Page 0 */
  50.     r.h.dh = (char) y;
  51.     r.h.dl = (char) x;
  52.     int86(16,&r,&r);
  53. }
  54.  
  55. void ClrScr()
  56. {
  57.     union REGS r;
  58.  
  59. /* Get video mode */
  60.     r.h.ah = 15;
  61.     int86(16,&r,&r);
  62.  
  63. /* Set video mode */
  64.     r.h.ah = 0;
  65.     int86(16,&r,&r);
  66. }
  67.  
  68.  
  69. /*
  70. From: uunet!netxcom!jallen (John Allen)
  71.  
  72. 1.  Trigger the joystick oneshots with an 'out' to 0x201.
  73.     This will set all of the joystick bits on.
  74.  
  75. 2.  Read (in) 0x201, finding:
  76.  
  77.     Bit        Contents
  78.     0        Joystick A X coordinate
  79.     1        Joystick A Y coordinate
  80.     2        Joystick B X coordinate
  81.     3        Joystick B Y coordinate
  82.     4        Button A 1
  83.     5        Button A 2
  84.     6        Button B 1
  85.     7        Button B 2
  86.  
  87. 3.  Continue reading 0x201 until all oneshots return to zero,
  88.     recording the loop during which each bit falls to zero.
  89.     The duration of the pulse from each oneshot may be used to
  90.     determine the resistive load (from 0 to 100K) from each
  91.     Joystick, as: Time = 24.2msec. + .011 (r) msec.
  92.  
  93. 4.  To do this correctly, I recommend calibrating the joystick;
  94.     have the user move the stick to each corner, then center it,
  95.     while recording the resulting values.
  96. */
  97.  
  98. void disp_stick(int line,joy_stick *joy)
  99. {
  100.     GotoXY(0,line);
  101.     printf("sw1 %d sw2 %d",joy -> sw1,joy -> sw2);
  102.     GotoXY(0,line+1);
  103.     printf("x %4d y %4d",joy -> x,joy -> y);
  104. }
  105.  
  106. void read_stick(int stick,joy_stick *joy)
  107. {
  108.     int k,jx,jy;
  109.     int c,m1,m2,m3,m4,m5;
  110.  
  111. /* Define masks for the chosen joystick */
  112.     if (stick == 1) m4 = 1; else
  113.     if (stick == 2) m4 = 4; else
  114.     printf("Invalid stick %d\n",stick);
  115.  
  116.     m5 = m4 << 1;
  117.     m1 = m4 << 4;
  118.     m2 = m5 << 4;
  119.     m3 = m4 + m5;
  120.  
  121. /* Trigger joystick */
  122.     outportb(0x201,0xff);
  123.     c = inportb(0x201);
  124.  
  125. /* Read switch settings */
  126.     joy -> sw1 = (c & m1) == 0;
  127.     joy -> sw2 = (c & m2) == 0;
  128.  
  129. /* Get X and Y positions */
  130.     for (k = 0; (c & m3) != 0; k++) {
  131.         if ((c & m4) != 0) jx = k;
  132.         if ((c & m5) != 0) jy = k;
  133.         c = inportb(0x201);
  134.     }
  135.     joy -> x = jx - (joy -> cenx);
  136.     joy -> y = jy - (joy -> ceny);
  137. }
  138.  
  139. int choose_stick(joy_stick *joy)
  140. {
  141.     int init_swa,init_swb,swa,swb;
  142.     int c,retval;
  143.  
  144.     printf("Center joystick and press fire, or press any key\n");
  145.     kb_clear();
  146.     outportb(0x201,0xff);
  147.     c = inportb(0x201);
  148.     init_swa = c & 0x30;
  149.     init_swb = c & 0xc0;
  150.     do {
  151.        outportb(0x201,0xff);
  152.        c = inportb(0x201);
  153.        swa = c & 0x30;
  154.        swb = c & 0xc0;
  155.     } while ((swa == init_swa) && (swb == init_swb) && !keypressed);
  156.     if (swa != init_swa) {
  157.        printf("Joystick 1 selected\n");
  158.        retval = 1;
  159.     } else if (swb != init_swb) {
  160.        printf("Joystick 2 selected\n");
  161.        retval = 2;
  162.     } else {
  163.        printf("Keyboard selected\n");
  164.        kb_clear();
  165.        retval = 0;
  166.     }
  167.  
  168.     if (retval != 0) { /* Determine Center */
  169.        joy -> cenx = joy -> ceny = 0;
  170.        read_stick(retval,joy);
  171.        joy -> cenx = joy -> x;
  172.        joy -> ceny = joy -> y;
  173.     }
  174.  
  175.     return(retval);
  176. }
  177.  
  178. main()
  179. {
  180.    int k;
  181.  
  182.    k = choose_stick(&joy);
  183.    ClrScr();
  184.    if (k != 0) while (!keypressed) {
  185.         read_stick(k,&joy);
  186.         disp_stick(0,&joy);
  187.    }
  188. }
  189.